#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

using std::cout;
using std::endl;
////////////////////////////////////////core dump///////////////////////////////////////
int main()
{
    pid_t id = fork();
    if(id == 0) //子进程
    {
        sleep(2);
        printf("hello linux!\n");
        printf("hello linux!\n");
        printf("hello linux!\n");
        printf("hello linux!\n");
        printf("hello linux!\n");
        int a = 10;
        a /= 0;   //设置除0错误
        printf("hello linux!\n");
        printf("hello linux!\n");

    }
    int status;
    int n = waitpid(id, &status, 0);
    printf("exit core:%d, exit signal:%d, core dump:%d\n",
            (status>>8)&0xFF, status&0x7F, (status>>7)&0x1);
    return 0;
}


////////////////////////////////////////信号的保存demo代码///////////////////////////////////
// void PrintPending(sigset_t &p)
// {
//     printf("进程[%d], pending:", getpid());
//     for(int i = 31; i >= 1; i--) //遍历所有信号
//     {
//         if( sigismember(&p, i) ) //判断信号集里的有效信号是否包含i，一个一个判断
//             cout << 1;
//         else
//             cout << 0;
//     }
//     cout << endl;
// }

// void handler(int sig)
// {
//     cout << sig << "号信号递达" << endl;
// }

// int main()
// {
//     signal(SIGINT, handler); //捕捉信号
//     //1.屏蔽2号信号
//     sigset_t block, oblock;
//     sigemptyset(&block); //初始化，清0
//     sigemptyset(&oblock); //初始化，清0
//     sigaddset(&block, SIGINT); //添加2号信号，此时并没有修改block表
    
//     // for(int i = 1; i <32; i++)
//     //     sigaddset(&block, i); //添加所有信号,号信号不可被屏蔽


//     //把在用户空间的位图结构（就是上面那些），设置到调用进程的block表里，是要写入到内核里的
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     int cnt = 10;
//     while(true) //不断获取
//     {
//         sleep(1);
//         cnt--;
//         sigset_t pending;
//         sigpending(&pending); //拿到当前进程pending表
//         PrintPending(pending); //打印
//         if(cnt == 0) //解除屏蔽
//         {
//             cout << "解除屏蔽" << endl;
//             sigprocmask(SIG_SETMASK, &oblock, nullptr); //用旧的block表
//         }
            
//     }

//     return 0;
// }